/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * HOJA DE TRABAJO #7
 * Fecha de Entrega: Sábado 8 de Octubre de 2011
 */

/**
 * Clase que representa el árbol de Huffman. 
 * @author José Antonio Bagur - 10275
 */

public class HuffmanTree implements Comparable {
    
         /* ATRIBUTOS DE LA CLASE HUFFMAN TREE */
         
        BinaryTree  root; 
        int pesoTotal;
        
         /* MÉTODOS DE LA CLASE HUFFMAN TREE */
        
        /**
         * Método que permite construir una hoja con el caracter asociado.
         * @param e 
         */
        public HuffmanTree(HuffmanLeaf e) {
            root = new BinaryTree(e);
            pesoTotal = e.frecuencia;
        }
        
        
        /**
         * Método que permite unir dos árboles en uno, actualizando también
         * el peso total de dicho árbol.
         * @param left
         * @param right 
         */
        public HuffmanTree(HuffmanTree left, HuffmanTree right) {
            this.pesoTotal = left.pesoTotal + right.pesoTotal;
            root = new BinaryTree(null, left.root, right.root);
        }
        
        
        /**
         * Método que compara dos instancias de árboles.
         * @param o 
         * @return integer que representa la relación entre los valores 
         * asociados de los árboles
         */
        public int compareTo(Object o) {
            HuffmanTree a = (HuffmanTree)o;
            return this.pesoTotal - a.pesoTotal;
        }
        
        
        /**
         * Método que compara dos instancias de árboles.
         * @param a
         * @return true si las instancias de árboles son las mismas
         */
        public boolean equals(Object a) {
            return this == a;
        }
        
        
        /**
         * Método que imprime los Strings asociados de los caracteres del
         * árbol. 
         */
        public void print() {
            print(this.root, "");
        }
        
        
        /**
         * Método que imprime los Strings asociados de los caracteres del 
         * árbol indicado. 
         * @param r
         * @param data 
         */
        protected void print(BinaryTree r, String data) {
            if (r.getLeft()!= null) {
                print(r.getLeft(), data+"0");
                print(r.getRight(), data+"1");
            } else {
                HuffmanLeaf e = (HuffmanLeaf)r.getValue();
                System.out.println(" | Codificación del caracter " + e.caracter + " es " + data + " (FRECUENCIA DEL CARACTER: " + e.frecuencia + ")");
            }
        }   
        
}   // FIN DE LA CLASE HUFFMANTREE
